using System.Collections.Generic;
using System.IO;

namespace DemoContentBuilder
{
    /// <summary>
    /// 将已加载的文件保存在内存中,以避免重复命中磁盘。
    /// </summary>
    /// <remarks>Because memory really isn't an issue.</remarks>
    public class ShaderFileCache
    {
        Dictionary<string, string> cache = new Dictionary<string, string>();

        public bool TryLoad(string path, out string shaderText)
        {
            lock (cache)
            {
                if (cache.TryGetValue(path, out shaderText))
                {
                    return true;
                }
            }

            // 我得在磁盘上查一下。
            // 请注意,其他线程当前可能也在查找它。我们可以有一个等待系统,但其中涉及的错误处理非常繁琐。缓存应该在大部分时间内命中。
            // 毕竟,这是一个优化问题,而不是一个正确性问题。
            if (File.Exists(path))
            {
                using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    using (StreamReader reader = new StreamReader(stream))
                    {
                        shaderText = reader.ReadToEnd();
                    }
                }
                lock (cache)
                {
                    // 添加或替换缓存中的路径。
                    cache[path] = shaderText;
                }
                return true;
            }
            // 此文件不存在。
            return false;


        }
    }
}
